<?php

class AggregatedModel_JoinCommunity extends RL_Model
{
	protected function init() {
		
	}
	
	/**
	 * Одобрить заявку пользователя на вступление: добавить его в сообщество, убрать из очереди
	 * Возвращаемые значения: 0 - все ок, 1 - не получилось добавить на уровне Acl, 2 - юзера нет в очереди, 3 - у юзера нету почты
	 * @param $user_oid - oid пользователя
	 * @return int
	 * @author Alexander Sibiryakov
	 **/
	public function approveUser($user_oid) {
		$jq = $this->ctx->mm->getModel("JoinQueue", "m");
		$jq->setCommunity($this->acl_ass->acl_data['comity_oid']);
		
		$status = 2;
		if ($jq->inQueue($user_oid)) {
			
			// надо заджойнить его в сообщество и выслать ему мессадж в почту			
			$c['role']['name']['=='] = "member";
			$rs = $this->store->find($c);
			$role = $rs->next();
			
			if ($this->acl_ass->joinCommunity($this->acl_ass->acl_data['comity_oid'], $role->id, $user_oid) > 0) {
				
				// удалить из очереди
				$jq->rmFromQueue($user_oid);
				
				$member_model = $this->ctx->mm->getModel("Member");
				$member = $member_model->createMember($user_oid, $this->acl_ass->acl_data['comity_oid']);
				$member_model->saveMember($member);
				
				// отправка почты
				$user_msg = $this->acl_ass->template_data;
								
				$this->rh->UseClass("Model_MailOutbox");
				$outbox = new Model_MailOutbox( $this->rh, $this->acl_ass);	
				$outbox->template = 'email/new_member_approve.html';
				$outbox->delete_after_send = true;
				
				$user = $this->ctx->store->getObject($user_oid);
				
				if ( !isset($user->data['email']) || (strlen(trim($user->data['email']))==0) ) {
				
					$status = 3;
				} else {
					$user_msg['user'] = $user->data['fullname'];
					$user_msg['to'] = $user->data['email'];

					// положить в очередь на отправку
					$outbox->post($user_msg);

					// отослать почту
					$outbox->list->select()->each(array($outbox, 'send'), $outbox->list);
					$status = 0;
				}	

			} else {
				$status = 1;
			}
		}
		return $status;
	}
	
	/**
	 * Отклоняет заявку пользователя
	 * Возвращает 0 - если все ок, 1 - если пользователя нет в очереди, 3 - у юзера нет почты
	 * @return int
	 * @author Alexander Sibiryakov
	 **/
	public function declineUser($user_oid) {
		
		$jq = $this->ctx->mm->getModel("JoinQueue", "m");
		$jq->setCommunity($this->acl_ass->acl_data['comity_oid']);
		$this->ctx->db->begin();
		if ($jq->inQueue($user_oid)) {
			
			// удалить из очереди
			$jq->rmFromQueue($user_oid);
			
			$member_model = $this->ctx->mm->getModel("Member");
			$member_model->removeMember($user_oid, $this->acl_ass->acl_data['comity_oid']);
			
			// отправка почты
			$user_msg = $this->acl_ass->template_data;
							
			$this->rh->UseClass("Model_MailOutbox");
			$outbox = new Model_MailOutbox( $this->rh, $this->acl_ass);	
			$outbox->template = 'email/new_member_decline.html';
			$outbox->delete_after_send = true;
			
			$user = $this->ctx->store->getObject($user_oid);
			
			if ( !isset($user->data['email']) || (strlen(trim($user->data['email']))==0) ) {
				
				$st = 3;
			} else {
				$user_msg['user'] = $user->data['fullname'];
				$user_msg['to'] = $user->data['email'];

				// положить в очередь на отправку
				$outbox->post($user_msg);

				// отослать почту
				$outbox->list->select()->each(array($outbox, 'send'), $outbox->list);
				$st = 0;
			}	
		} else {
			$st = 1;
		}
		$this->ctx->db->end();		
		return $st;
	}
	
	/**
	 * Принять все заявки, используется если модератор сменил режим членства в сообществе на свободный с модерируемого
	 *
	 * @return boolean
	 * @author Alexander Sibiryakov
	 **/
	public function approveAll() {
		$jq = $this->ctx->mm->getModel("JoinQueue", "m");
		$jq->setCommunity($this->acl_ass->acl_data['comity_oid']);
		
		$user_oids = $jq->getUserOidsFromQueue();
		$all_good = true;
		foreach ($user_oids as $i=>$oid) {
			$st = $this->approveUser($oid);
			if ($st != 0)  {
				$all_good = false;
				break;
			}
			
		}
		return $all_good;
		
	}
	
}
